查看原文
其他

【源头活水】CVPR 2021 | AdCo-基于对抗的对比学习(已开源)

“问渠那得清如许,为有源头活水来”,通过前沿领域知识的学习,从其他研究领域得到启发,对研究问题的本质有更清晰的认识和理解,是自我提高的不竭源泉。为此,我们特别精选论文阅读笔记,开辟“源头活水”专栏,帮助你广泛而深入的阅读科研文献,敬请关注。

来源:知乎—齐国君
地址:https://www.zhihu.com/question/434919597/answer/1682526014
在自监督学习领域,基于contrastive learning(对比学习)的思路已经在下游分类检测和任务中取得了明显的优势。其中如何充分利用负样本提高学习效率和学习效果一直是一个值得探索的方向,本文第一次全新提出了用对抗的思路end-to-end来直接学习负样本,在ImageNet和下游任务均达到SOTA。
AdCo仅仅用8196个负样本(八分之一的MoCo v2的负样本量),就能达到与之相同的精度。同时,这些可直接训练的负样本在和BYOL中Prediction MLP参数量相同的情况下依然能够取得相似的效果。这说明了在自监督学习时代,通过将负样本可学习化,对比学习仍然具有学习效率高、训练稳定和精度高等一系列优势。
论文:https://arxiv.org/abs/2011.08435
代码:https://github.com/maple-research-lab/AdCo 
众所周知,负样本和正样本是对比学习的关键。进一步而言,负样本的数量和质量对于对比学习又是其中的重中之重。在BYOL[1]提出后,对于是否需要负样本也引发了很多讨论,本文从对抗的角度去探索负样本,也揭示了负样本的本质和BYOL在去除负样本之后仍然能够达到非常好的效果的原因。

01

要不要负样本?
首先,去年DeepMind提出的无监督模型BYOL[1] 的一个突出特点是去掉了负样本,在讨论AdCo前,一个很核心的问题就是在自监督时代,我们究竟要不要负样本?
从比较纯粹的实用主义角度来说,MoCo V2 [2]这类基于负样本的对比学习方法,自监督训练的时间都是比BYOL较少的。这点不难理解,MoCo V2不需要基于Global Batch Normalization (BN)(GPU之间需要通讯),所以从速度来说仅仅需要BYOL约1/3的时间。
另一方面,类似MoCo V2的方法一个比较麻烦的地方是要不断得维护一个负样本的队列。但是,用一组负样本做对比学习,从训练性能的角度来说,从前诸多的实验来看可能更稳定,毕竟多个负样本的对比可以提供更多的样本的分布信息,比BYOL只在单个图像的两个变换增强样本得到的特征上做MSE从训练的角度来说可以更稳定。同时memory bank维持的负样本并不需要梯度计算,所以相关计算量可以忽略不计。
因此,我们认为负样本在对比学习里仍然是一个值得探索的方向。但需要解决如何提高负样本的质量和使用效率的问题。一个比较好的想法是我们能不能不再依赖一个被动的维护一个负样本队列去训练对比模型,而是直接通过主动学习的方法把负样本当作网络参数的一部分去做end-to-end的训练?

02

AdCo vs. BYOL
BYOL中除了global BN外,为了用一个分支得到的特征去监督另外一个分支输出的特征,还需要训练一个只存在于query分支的MLP的预测器(predictor)以达到非对称的结构防止训练collapse。虽然BYOL的predictor里的参数不是负样本,但某种意义上可以看作是某种包含典型样本对应特征的codebook,这个codebook的组合形成了对另一个分支输出特征的预测。为了达到精确预测的目的,势必要求这个codebook要比较diverse,能比较好的覆盖另外一个分支输出的特征,从而阻止collapse的可能。
从模型参数的角度来说,这个额外的 Predictor Layer 相当于一般对比学习里用到的负样本,只不过前者是直接通过反向传播训练得到的,而后者在MoCo V2[2]和SimCLR[3]里是通过收集过去或者当前的batch中的特征得到的。
那么,一个自然的问题就是,负样本能够也能像预测器一样通过训练出来吗?如果可以,就意味着对比学习中的负样本也可以看作是模型的一部分,并且可以通过训练的方法得到,这就给出了一种更加直观优美的方法来构造负样本。
遗憾的是,直接去最小化contrastive loss并不能用来训练负样本,因为这样得到的是远离所有query样本的负样本,因此我们在AdCo中采取了对抗学习的思路。

03

新思路:用对抗对比学习去直接训练负样本!
依据此,我们提出了AdCo对抗对比学习,通过直接训练负样本的方式来进一步提高负样本的质量从而促进对比学习。
(1)相比于memory bank去存储过往图片embedding的方式,我们完全可以把负样本作为可学习的权重来训练,这里的好处是我们的所有负样本可以在每次迭代中同步更新。质量。作为对比,MoCo V2每次只能更新当前负样本队列里的很小的一部分,这导致了最早进入memory bank的负样本对于对比学习的贡献相对较小。
(2)当然,更新负样本就不能去最小化对应的contrastive loss,而要最大化它,使得得到的负样本更加地困难,而对训练representation network更有价值,这就得到了一个对抗性的对比学习,对抗的双方是负样本和特征网络。
(3)通过对update负样本的梯度进行分析,我们发现这种方法具有非常明显的物理意义。负样本每次更新的方向都是指向当前正样本的一个以某个负样本所归属的正样本的后验概率为权重,对正样本做加权平均得到的梯度方向;
具体而言,文章中的公式(6)通过最大化对比损失函数可以给出直接训练负样本的梯度:
其中的条件概率是
不难看出,用来更新每个负样本  的梯度方向正是沿着对每个batch中正样本   通过 进行加权平均方向得到的方向。这样做,可以最大化地引导负样本不断地靠近正样本,进而能够提高对比学习地效率。
实验发现,在同样的训练时间、minibatch大小下,AdCo的精度都会更高。这说明了,AdCo比其他的自监督方法就有更高的训练效率和精度。这种提升来自对负样本更有效的更新迭代。

04

实验结果
相比于基于memory bank的方法,我们的模型在ImageNet分类任务上有了显著的提升。同时,在下游检测和分类任务中,我们相比过往自监督方法和全监督方法都有显著的提升:
我们进一步AdCo是否可以通过训练更少的负样本来得到同样好的无监督预训练模型。答案是肯定的。
如下面的结果所展示的,只用原先1/4和1/8的样本,在ImageNet 上的top-1 accuracy几乎没有任何损失。这进一步说明了,通过直接用对抗的方式训练负样本,把负样本看成是模型可训练参数的一部分,完全可以得到非常好的训练效果,而且相对于其他的模型,所用的 GPU训练时间也更少。
进一步而言,我们的学习效率也显著优于基于memory bank的方法,以下是不同自监督训练轮数下在ImageNet上的对比: 
参考文献
[1] Grill, Jean-Bastien, et al. "Bootstrap your own latent: A new approach to self-supervised learning." arXiv preprint arXiv:2006.07733 (2020).
[2] Chen, Xinlei, et al. "Improved baselines with momentum contrastive learning." arXiv preprint arXiv:2003.04297 (2020).
[3] Chen, Ting, et al. "A simple framework for contrastive learning of visual representations." International conference on machine learning. PMLR, 2020.


本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“源头活水”历史文章


更多源头活水专栏文章,

请点击文章底部“阅读原文”查看



分享、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存